package controllers;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

import models.ComidaPlan;
import models.Genero;
import models.Nutri;
import models.PorcionPlan;
import models.TemplatePlan;
import models.TipoPlan;
import models.VisibilidadTemplatePlan;
import play.db.Model;
import play.exceptions.TemplateNotFoundException;
import play.mvc.With;
import controllers.securesocial.SecureSocial;

@With(SecureSocial.class)
public class TemplatePlans extends CustomCRUD {
	
	public static void agregarPorcionTemplatePlan(String templatePlanId, Long comidaPlanId, String genero, Integer cantidadPorciones) throws Exception {
		
		ComidaPlan comidaPlan = ComidaPlan.findById(comidaPlanId);
		
		PorcionPlan porcionPlan = comidaPlan.contienePorcionPlanDelGenero(Genero.valueOf(genero));
		
		if(porcionPlan != null) {
			porcionPlan.setCantidadDePorciones(porcionPlan.getCantidadDePorciones() + cantidadPorciones);
		}
		else {
			porcionPlan = new PorcionPlan(Genero.valueOf(genero), cantidadPorciones);
		}
		
		comidaPlan.agregarPorcionPlan(porcionPlan);
		
		comidaPlan.save();
		
		show(templatePlanId);
		
    }
	
	public static void eliminarPorcionTemplatePlan(String templatePlanId, Long porcionId) throws Exception {
		
		PorcionPlan porcionPlan = PorcionPlan.findById(porcionId);
		
		porcionPlan.delete();
		
		show(templatePlanId);
		
    }
    
	public static void list(int page, String search, String searchFields, String orderBy, String order) {
		
		Nutri nutri = (Nutri)getUsuarioLogueado();
		
		Long nutriId = nutri.id;
		
		ObjectType type = ObjectType.get(getControllerClass());
		notFoundIfNull(type);
		
		if (page < 1) {
			page = 1;
		}
		
		List<Model> objects = type.findPage(page, search, searchFields, orderBy, order, (String) request.args.get("where"));
		
		List<Model> filteredObjects = new ArrayList<Model>();
		
		for (Model model : objects) {
			if (((TemplatePlan)model).getAutor() != null && ((TemplatePlan)model).getAutor().id.equals(nutriId)) {
				filteredObjects.add(model);
			}
		}
		
		objects = filteredObjects;
		
		Long count = new Long(objects.size());
		Long totalCount = new Long(objects.size());
		
        try {
            render(type, objects, count, totalCount, page, orderBy, order, nutriId);
        } catch (TemplateNotFoundException e) {
            render(getControllerName() + "/list.html", type, objects, count, totalCount, page, orderBy, order, nutriId);
        }
    }
	
	public static void publicar(Long id, String visibilidad) throws Exception {
		
		TemplatePlan template = TemplatePlan.findById(id);
		
		template.setVisibilidad(VisibilidadTemplatePlan.valueOf(visibilidad));
		
		template.save();
		
		list(0, null, null, null, null);
	}
	
	public static void show(String id) throws Exception {
		
		ObjectType type = ObjectType.get(getControllerClass());
		notFoundIfNull(type);
		
		TemplatePlan object = (TemplatePlan)type.findById(id);
		
		notFoundIfNull(object);
		
		try {
			render(type, object);
		} catch (TemplateNotFoundException e) {
			render(getControllerName() + "/show.html", type, object);
		}
	}
	
	public static void blank() throws Exception {
		
		ObjectType type = ObjectType.get(getControllerClass());
		notFoundIfNull(type);
		
		Constructor<?> constructor = type.entityClass.getDeclaredConstructor();
		constructor.setAccessible(true);
		
		TemplatePlan object = new TemplatePlan();
		
		object.inicializarCon6Comidas();
		object.setTipo(TipoPlan.NORMAL);
		object.setAutor((Nutri)getUsuarioLogueado());
		object.setNombre("_");
		
		object.setTemporal(Boolean.TRUE); // para que se pueda cancelar en la creación. Si tiene True, en lugar de cancelar, te lo borra todo
		
		object.save();
		
		try {
			render(type, object);
		} catch (TemplateNotFoundException e) {
			render(getControllerName() + "/show.html", type, object);
		}
	}
	
	public static void cancelDelete(Long id) {
		
		TemplatePlan templatePlan = TemplatePlan.findById(id);
		
		templatePlan.delete();
		
		list(0, null, null, null, null);
		
	}
	
}
